package cn.zyjblogs.netty.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 说明
 * 1、自定义一个Handler 需要继承netty规定好的某个HandlerAdapter
 */
public class NIOServerHandler extends SimpleChannelInboundHandler<StudentPO.Student> {

    private ReentrantLock lock =new ReentrantLock();

//    /**
//     * 读取数据实际（这里我们可以读取客户端发送的消息）
//     *
//     * @param ctx 上下文对象 含有管道pipeline 通道channel和地址
//     * @param msg 客户端发送的数据 默认Object
//     * @throws Exception
//     */
//    @Override
//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//      //读取从客户端发送的StudentPO.Student
//        StudentPO.Student student = (StudentPO.Student)msg;
//        System.out.println("客户端发送的数据  id="+student.getId()+" name="+student.getName());
//    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, StudentPO.Student student) throws Exception {
        System.out.println("客户端发送的数据  id="+student.getId()+" name="+student.getName());
    }

    //数据读取完毕
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // super.channelReadComplete(ctx);
        //writeAndFlush  是write和flush 方法  将数据写入到缓存 并刷新
        //一般将，我们需要对发送数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端~o( =∩ω∩= )m喵 || 1", CharsetUtil.UTF_8));
    }

    //处理异常 一般是需要关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // super.exceptionCaught(ctx, cause);
        ctx.close();
    }
}
